import axios, {
    AxiosError,
    AxiosRequestConfig,
    AxiosResponse
} from 'axios';
import { ElMessage } from 'element-plus';

import { usePermissionStore } from '@/store/modules/permission';
import { useUserStore } from '@/store/modules/user';

let tag = true
let PermissionStore
let userStore
// 创建axios实例 进行基本参数配置
const service = axios.create({
    // 默认请求地址，根据环境的不同可在.env 文件中进行修改
    baseURL: import.meta.env.VITE_APP_BASE_API,
    // 设置接口访问超时时间
    timeout: 10000, // request timeout，
    // 跨域时候允许携带凭证
    withCredentials: true
})
//  request interceptor 接口请求拦截
service.interceptors.request.use((config: AxiosRequestConfig) => {
    /**
     * 用户登录之后获取服务端返回的token,后面每次请求都在请求头中带上token进行JWT校验
     * token 存储在本地储存中（storage）、pinia
     */
    userStore = useUserStore()
    const token: string = userStore.token;
    // 自定义请求头
    if (token) {
        config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
}, (error: AxiosError) => {
    // 请求错误，这里可以用全局提示框进行提示
    return Promise.reject(error);
})

//  response interceptor 接口响应拦截
service.interceptors.response.use((response: AxiosResponse) => {
    // 直接返回res，当然你也可以只返回res.data
    // 系统如果有自定义code也可以在这里处理
    if (response.data.code === 0 || response.data.code === 200) {
        return response.data
    } else if (response.data.code === 1) {
        showErrMessage(response.data.msg)
        return Promise.reject(response)
    } else if (response.data.code === 401) {
        PermissionStore = usePermissionStore()
        userStore.logoutNo()
        PermissionStore.clearRoutes()
        showErrMessage('身份已过期，请重新登录')
        return Promise.reject(response.data)
    } else {
        if (response.config.fileName) {
            if (response.data.size) {
                fileDownload(response, response.config.fileName)
                showErrMessage('文件下载中，请耐心等待', 'success')
            } else {
                showErrMessage('文件不存在')
            }
        } else {
            if (response.data.access_token) {
                return response.data
            } else {
                showErrMessage(response.data.msg)
            }
        }
    }
    // return Promise.reject(response.data)
}, (error: AxiosError) => {
    if (tag) {
        tag = false
        if (error.response?.config?.fileName) {
            let reader = new FileReader()
            reader.onload = function () {
                const msg = JSON.parse(reader.result);
                showErrMessage(msg.error)
            }
            reader.readAsText(error.response.data, "utf-8")
        } else {
            window.setTimeout(() => {
                tag = true
            }, 2000)
            // showErrMessage(error.response.data.msg)
            showErrMessage(error.message)
        }
        return Promise.reject(error)
    }
})

/**
 * @description 显示错误消息
 * opt 传入参数
 * err 错误信息
 * type 消息类型
 * duration 消息持续时间
 */
function showErrMessage(message, type: any = 'error', duration: number = 5000) {
    ElMessage({
        message: message,
        type: type,
        duration: duration
    })
}

// 内容转化为文件下载
export const fileDownload = (response, fileName) => {
    // 保存为Excel文件
    const url = window.URL.createObjectURL(new Blob([response.data]));
    const link = document.createElement('a');
    link.href = url
    link.setAttribute('download', fileName);
    document.body.appendChild(link);
    link.click();
}

export default service
